home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 039a / lh113src.zip / HUF.ASM < prev    next >
Assembly Source File  |  1989-05-04  |  16KB  |  660 lines

  1. page    66, 120                    ;
  2. ;$_init                        ;
  3. ;***********************************************;
  4. ;    LHarc version 1.13 (c) Yoshi 1988-89.    ;
  5. ;    adaptive Huffman module : 1989/ 5/ 4    ;
  6. ;                        ;
  7. ; HTAB = 8                    ;
  8. ;***********************************************;
  9.                         ;
  10. extrn    __fgetc:near                ;
  11. extrn    fputc  :near                ;
  12.                         ;
  13. ;***************************************    ;
  14. ;    getc macro                ;
  15. ;        bx: address of FILE struc        ;
  16. ;        ax: input char (return)        ;
  17. ;***************************************    ;
  18. getc@    macro                    ;
  19.     local    getc1, getc2            ;
  20.     dec    word ptr [bx]            ;
  21.     jl    getc1                ;
  22.     inc    word ptr [bx+10]        ;
  23.     mov    bx, [bx+10]            ;
  24.     mov    al, [bx-1]            ;
  25.     xor    ah, ah                ;
  26.     jmp    getc2                ;
  27. getc1:                        ;
  28.     push    dx                ;
  29.     push    cx                ;
  30.     push    bx                ;
  31.     call    __fgetc                ;
  32.     pop    bx                ;
  33.     pop    cx                ;
  34.     pop    dx                ;
  35. getc2:                        ;
  36.     endm                    ;
  37.                         ;
  38. ;***************************************    ;
  39. ;    putc macro                ;
  40. ;        ax: output char            ;
  41. ;        bx: address of FILE struc        ;
  42. ;***************************************    ;
  43. putc@    macro                    ;
  44.     local    putc1, putc2            ;
  45.     inc    word ptr [bx]            ;
  46.     jge    putc1                ;
  47.     inc    word ptr [bx+10]        ;
  48.     mov    bx, [bx+10]            ;
  49.     mov    [bx-1], al            ;
  50.     jmp    short putc2            ;
  51. putc1:                        ;
  52.     call    fputc                ;
  53. putc2:                        ;
  54.     endm                    ;
  55.                         ;
  56. DGROUP    group    _DATA, _BSS            ;
  57.     assume    cs:_TEXT, ds:DGROUP        ;
  58.                         ;
  59. _DATA    segment word public 'DATA'        ;
  60.                         ;
  61. ;-----------------------------------------------;
  62. ;    ê╩ÆuÅεò±òäìåë╗ò\            ;
  63. ;-----------------------------------------------;
  64.     public    _p_len, _p_code            ;
  65.     public    _d_len, _d_code            ;
  66. _p_len    label    byte                ;
  67.     db    003h, 004h, 004h, 004h, 005h, 005h, 005h, 005h
  68.     db    005h, 005h, 005h, 005h, 006h, 006h, 006h, 006h
  69.     db    006h, 006h, 006h, 006h, 006h, 006h, 006h, 006h
  70.     db    007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h
  71.     db    007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h
  72.     db    007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h
  73.     db    008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h
  74.     db    008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h
  75.                         ;
  76. _p_code    label    byte                ;
  77.     db    000h, 020h, 030h, 040h, 050h, 058h, 060h, 068h
  78.     db    070h, 078h, 080h, 088h, 090h, 094h, 098h, 09Ch
  79.     db    0A0h, 0A4h, 0A8h, 0ACh, 0B0h, 0B4h, 0B8h, 0BCh
  80.     db    0C0h, 0C2h, 0C4h, 0C6h, 0C8h, 0CAh, 0CCh, 0CEh
  81.     db    0D0h, 0D2h, 0D4h, 0D6h, 0D8h, 0DAh, 0DCh, 0DEh
  82.     db    0E0h, 0E2h, 0E4h, 0E6h, 0E8h, 0EAh, 0ECh, 0EEh
  83.     db    0F0h, 0F1h, 0F2h, 0F3h, 0F4h, 0F5h, 0F6h, 0F7h
  84.     db    0F8h, 0F9h, 0FAh, 0FBh, 0FCh, 0FDh, 0FEh, 0FFh
  85.                         ;
  86. ;-----------------------------------------------;
  87. ;    ê╩ÆuÅεò±ë≡ô╟ò\                ;
  88. ;-----------------------------------------------;
  89. _d_code    db    00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
  90.     db    00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
  91.     db    00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
  92.     db    00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
  93.     db    01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
  94.     db    01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
  95.     db    02h, 02h, 02h, 02h, 02h, 02h, 02h, 02h
  96.     db    02h, 02h, 02h, 02h, 02h, 02h, 02h, 02h
  97.     db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  98.     db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  99.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  100.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  101.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  102.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  103.     db    08h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
  104.     db    09h, 09h, 09h, 09h, 09h, 09h, 09h, 09h
  105.     db    0Ah, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah
  106.     db    0Bh, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh
  107.     db    0Ch, 0Ch, 0Ch, 0Ch, 0Dh, 0Dh, 0Dh, 0Dh
  108.     db    0Eh, 0Eh, 0Eh, 0Eh, 0Fh, 0Fh, 0Fh, 0Fh
  109.     db    10h, 10h, 10h, 10h, 11h, 11h, 11h, 11h
  110.     db    12h, 12h, 12h, 12h, 13h, 13h, 13h, 13h
  111.     db    14h, 14h, 14h, 14h, 15h, 15h, 15h, 15h
  112.     db    16h, 16h, 16h, 16h, 17h, 17h, 17h, 17h
  113.     db    18h, 18h, 19h, 19h, 1Ah, 1Ah, 1Bh, 1Bh
  114.     db    1Ch, 1Ch, 1Dh, 1Dh, 1Eh, 1Eh, 1Fh, 1Fh
  115.     db    20h, 20h, 21h, 21h, 22h, 22h, 23h, 23h
  116.     db    24h, 24h, 25h, 25h, 26h, 26h, 27h, 27h
  117.     db    28h, 28h, 29h, 29h, 2Ah, 2Ah, 2Bh, 2Bh
  118.     db    2Ch, 2Ch, 2Dh, 2Dh, 2Eh, 2Eh, 2Fh, 2Fh
  119.     db    30h, 31h, 32h, 33h, 34h, 35h, 36h, 37h
  120.     db    38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
  121.                         ;
  122.                         ;
  123. _d_len    db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  124.     db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  125.     db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  126.     db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  127.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  128.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  129.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  130.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  131.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  132.     db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
  133.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  134.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  135.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  136.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  137.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  138.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  139.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  140.     db    05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
  141.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  142.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  143.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  144.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  145.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  146.     db    06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
  147.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  148.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  149.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  150.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  151.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  152.     db    07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
  153.     db    08h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
  154.     db    08h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
  155.     even                    ;
  156. _DATA    ends                    ;
  157.                         ;
  158.         public    THRESHOLD, F, N_CHAR, T    ;
  159. THRESHOLD    equ    2            ;
  160. F        equ    60            ;
  161. N_CHAR        equ    (256 - THRESHOLD + F)    ;
  162. T        equ    (N_CHAR * 2 - 1)    ;
  163. R        equ    (T - 1)            ;
  164. MAX_FREQ    equ    8000h            ;
  165.                         ;
  166. _BSS    segment    word public 'BSS'        ;
  167.     public    _freq, _prnt, _son        ;
  168.     public    _iobuf, _iolen, _iobuf, _iolen    ;
  169.                         ;
  170. _freq    dw    (T + 1) dup (?)            ;
  171. _prnt    dw    (T + N_CHAR) dup (?)        ;
  172. _son    dw    T dup (?)            ;
  173. _iobuf    label    word                ;
  174.     dw    1 dup (?)            ;
  175. _iolen    label    byte                ;
  176.     db    1 dup (?)            ;
  177. _BSS    ends                    ;
  178.                         ;
  179. extrn    _infile        :word            ;
  180. extrn    _outfile    :word            ;
  181. extrn    _codesize    :word            ;
  182. extrn    _backup2    :byte            ;
  183. extrn    _error        :near            ;
  184.                         ;
  185. _TEXT    segment    byte public 'CODE'        ;
  186.     assume    cs:_TEXT, ds:DGROUP        ;
  187.                         ;
  188. ;-----------------------------------------------;
  189. ;    ôⁿù═é⌐éτéPâoâCâgé≡ô╛éΘ            ;
  190. ;-----------------------------------------------;
  191.         public    _GetByte        ;
  192. _GetByte    proc    near            ;
  193.     mov    dx, DGROUP:_iobuf        ;
  194.     cmp _iolen, 8
  195.     jG $_1
  196.         call    _GetBufFill        ;
  197. $_1:
  198.     xchg    dl, dh                ;
  199.     mov    ax, dx                ;
  200.     xor    dl, dl                ;
  201.     mov    DGROUP:_iobuf, dx        ;
  202.     sub    DGROUP:_iolen, 8        ;
  203.     xor    ah, ah                ;
  204.     ret                    ;
  205. _GetByte    endp                ;
  206.                         ;
  207. ;-----------------------------------------------;
  208. ;    ôⁿù═é⌐éτéÄârâbâgé≡ô╛éΘ            ;
  209. ;-----------------------------------------------;
  210. ;    cl : n bits                ;
  211. ;-----------------------------------------------;
  212.         public    _GetNBits        ;
  213. _GetNBits    proc    near            ;
  214.     push    cx                ;
  215.     mov    dx, DGROUP:_iobuf        ;
  216.     cmp _iolen, 8
  217.     jG $_2
  218.         call    _GetBufFill        ;
  219. $_2:
  220.     pop    cx                ;
  221.     mov    ax, dx                ;
  222.     shl    dx, cl                ;
  223.     mov    DGROUP:_iobuf, dx        ;
  224.     sub    DGROUP:_iolen, cl        ;
  225.     mov    dx, -1                ;
  226.     shr    dx, cl                ;
  227.     not    dx                ;
  228.     and    ax, dx                ;
  229.     ret                    ;
  230. _GetNBits    endp                ;
  231.                         ;
  232. ;-----------------------------------------------;
  233. ;    éPâoâCâgôⁿù═                ;
  234. ;-----------------------------------------------;
  235. _GetBufFill    proc    near            ;
  236.     mov    bx, DGROUP:_infile        ;
  237.     dec    word ptr [bx]            ;
  238.     jl    getc1                ;
  239.     inc    word ptr [bx+10]        ;
  240.     mov    bx, [bx+10]            ;
  241.     mov    al, [bx-1]            ;
  242.     xor    ah, ah                ;
  243.     jmp    getc2                ;
  244. getc1:                        ;
  245.     push    dx                ;
  246.     push    cx                ;
  247.     push    bx                ;
  248.     call    __fgetc                ;
  249.     or ax, ax
  250.     jGE $_3
  251.         inc    ax            ;
  252. $_3:
  253.     pop    bx                ;
  254.     pop    cx                ;
  255.     pop    dx                ;
  256. getc2:                        ;
  257.     mov    cl, 8                ;
  258.     sub    cl, DGROUP:_iolen        ;
  259.     shl    ax, cl                ;
  260.     or    dx, ax                ;
  261.     add    DGROUP:_iolen, 8        ;
  262.     ret                    ;
  263. _GetBufFill    endp                ;
  264.                         ;
  265. ;-----------------------------------------------;
  266. ;    éÄârâbâgÅoù═                ;
  267. ;-----------------------------------------------;
  268. ; ax : code                    ;
  269. ; ch : len                    ;
  270. ;-----------------------------------------------;
  271.         public    _Putcode        ;
  272. _Putcode    proc    near            ;
  273.     mov    dx, ax                ;
  274.     mov    cl, DGROUP:_iolen        ;
  275.     shr    ax, cl                ;
  276.     or    _iobuf, ax            ;
  277.     add    cl, ch                ;
  278.     cmp    cl, 8                ;
  279.     jae    _PutBuf1            ;
  280. _Putcode1:                    ;
  281.     mov    _iolen, cl            ;
  282.     ret                    ;
  283.                         ;
  284. _PutBuf1:                    ;
  285.     mov    al, byte ptr _iobuf + 1        ;
  286.     mov    bx, DGROUP:_outfile        ;
  287.     putc@                    ;
  288.     sub    cl, 8                ;
  289.     cmp    cl, 8                ;
  290.     jae    _PutBuf2            ;
  291.     mov    ah, byte ptr _iobuf        ;
  292.     mov    al, 0                ;
  293.     mov    _iobuf, ax            ;
  294.     add    DGROUP:_codesize, 1        ;
  295.     adc    DGROUP:_codesize + 2, 0        ;
  296.     jmp    _Putcode1            ;
  297.                         ;
  298. _PutBuf2:                    ;
  299.     mov    al, byte ptr _iobuf        ;
  300.     mov    bx, DGROUP:_outfile        ;
  301.     putc@                    ;
  302.     add    DGROUP:_codesize, 2        ;
  303.     adc    DGROUP:_codesize + 2, 0        ;
  304.     sub    cl, 8                ;
  305.     sub    ch, cl                ;
  306.     xchg    cl, ch                ;
  307.     shl    dx, cl                ;
  308.     xchg    cl, ch                ;
  309.     mov    _iobuf, dx            ;
  310.     jmp    _Putcode1            ;
  311. _Putcode    endp                ;
  312.                         ;
  313. ;-----------------------------------------------;
  314. ;    égétéeùpé╠û╪ì\æóé╠Åëè·ë╗        ;
  315. ;-----------------------------------------------;
  316.         public    _StartModel        ;
  317. _StartModel    proc    near            ;
  318.     push    si                ;
  319.     push    di                ;
  320.     mov    ax, ds                ;
  321.     mov    es, ax                ;
  322.     cld                    ;
  323.                         ;
  324.     mov    ax, 1                ;
  325.     mov    cx, N_CHAR            ;
  326.     mov    di, offset DGROUP:_freq        ;
  327.     rep    stosw                ;
  328.                         ;
  329.     mov    ax, T * 2            ;
  330.     mov    dx, 0                ;
  331.     mov    cx, N_CHAR            ;
  332.     mov    di, offset DGROUP:_son        ;
  333.     mov    bx, offset DGROUP:_prnt[T * 2]    ;
  334. $_4:
  335.         stosw                ;
  336.         add    ax, 2            ;
  337.         mov    [bx], dx        ;
  338.         add    bx, 2            ;
  339.         add    dx, 2            ;
  340.     LOOP $_4
  341. $_5:
  342.                         ;
  343.     mov    si, 0                ;
  344.     mov    di, 2                ;
  345.     mov    bx, N_CHAR * 2            ;
  346.     mov    cx, N_CHAR - 1            ;
  347. $_6:
  348.         mov    ax, _freq[si]        ;
  349.         add    ax, _freq[di]        ;
  350.         mov    _freq[bx], ax        ;
  351.         mov    _son[bx], si        ;
  352.         mov    _prnt[si], bx        ;
  353.         mov    _prnt[di], bx        ;
  354.         add    si, 4            ;
  355.         add    di, 4            ;
  356.         add    bx, 2            ;
  357.     LOOP $_6
  358. $_7:
  359.     xor    ax, ax                ;
  360.     mov    _iobuf, ax            ;
  361.     mov    _iobuf, ax            ;
  362.     mov    _iolen, al            ;
  363.     mov    _iolen, al            ;
  364.     mov    word ptr DGROUP:_freq[T * 2], -1;
  365.     mov    word ptr DGROUP:_prnt[R * 2], ax; 0
  366.     pop    di                ;
  367.     pop    si                ;
  368.     ret                    ;
  369. _StartModel    endp                ;
  370.                         ;
  371. ;-----------------------------------------------;
  372. ;    û╪ì\æóé╠ì─ì\Æz                ;
  373. ;-----------------------------------------------;
  374.         public    _reconst        ;
  375. _reconst    proc    near            ;
  376.     push    si                ;
  377.     mov    ax, ds                ;
  378.     mov    es, ax                ;
  379.     xor    si, si                ;
  380.     mov    di, si                ;
  381. $_8:
  382.         cmp _son[si], T * 2
  383.         jB $_10
  384.             mov    ax, _freq[si]    ;
  385.             inc    ax        ;
  386.             shr    ax, 1        ;
  387.             mov    _freq[di], ax    ;
  388.             mov    ax, _son[si]    ;
  389.             mov    _son[di], ax    ;
  390.             inc    di        ;
  391.             inc    di        ;
  392. $_10:
  393.         inc    si            ;
  394.         inc    si            ;
  395.     cmp si, T * 2
  396.     jB $_8
  397. $_9:
  398.     xor    si, si                ;
  399.     mov    di, N_CHAR * 2            ;
  400. $_11:
  401.         mov    bx, si            ;
  402.         inc    bx            ;
  403.         inc    bx            ;
  404.         mov    ax, _freq[si]        ;
  405.         add    ax, _freq[bx]        ;
  406.         mov    _freq[di], ax        ;
  407.                         ;
  408.         mov    bx, di            ;
  409. $_13:
  410.             dec    bx        ;
  411.             dec    bx        ;
  412.         cmp ax, _freq[bx]
  413.         jB $_13
  414. $_14:
  415.         inc    bx            ;
  416.         inc    bx            ;
  417.         mov    cx, di            ;
  418.         sub    cx, bx            ;
  419.         shr    cx, 1            ;
  420.         std                ;
  421.         push    cx            ;
  422.         push    si            ;
  423.         push    di            ;
  424.         lea    si, _freq[di]        ;
  425.         mov    di, si            ;
  426.         dec    si            ;
  427.         dec    si            ;
  428.         rep    movsw            ;
  429.         mov    _freq[bx], ax        ;
  430.         pop    di            ;
  431.         pop    si            ;
  432.         pop    cx            ;
  433.                         ;
  434.         push    si            ;
  435.         push    di            ;
  436.         lea    si, _son[di]        ;
  437.         mov    di, si            ;
  438.         dec    si            ;
  439.         dec    si            ;
  440.         rep    movsw            ;
  441.         pop    di            ;
  442.         pop    si            ;
  443.         mov    _son[bx], si        ;
  444.                         ;
  445.         add    si, 4            ;
  446.         add    di, 2            ;
  447.     cmp di, T * 2
  448.     jB $_11
  449. $_12:
  450.     xor    si, si                ;
  451. $_15:
  452.         mov    di, _son[si]        ;
  453.         mov    _prnt[di], si        ;
  454.         cmp di, T * 2
  455.         jAE $_17
  456.             mov    _prnt[di + 2], si
  457. $_17:
  458.         inc    si            ;
  459.         inc    si            ;
  460.     cmp si, T * 2
  461.     jB $_15
  462. $_16:
  463.     pop    si                ;
  464.     ret                    ;
  465. _reconst    endp                ;
  466.                         ;
  467. ;-----------------------------------------------;
  468. ;    û╪ì\æóé╠ìXÉV                ;
  469. ;-----------------------------------------------;
  470. ;    si : prnt[c + T]            ;
  471. ;-----------------------------------------------;
  472.     public    _update                ;
  473. _update    proc    near                ;
  474.     cmp _freq[R * 2], MAX_FREQ
  475.     jB $_18
  476.         call    near ptr _reconst    ;
  477. $_18:
  478.     mov    si, _prnt[si + T * 2]        ;
  479. $_19:
  480.         mov    ax, _freq[si]        ;
  481.         inc    ax            ;
  482.         mov    _freq[si], ax        ;
  483.         lea    di, [si + 2]        ;
  484.         cmp ax, _freq[di]
  485.         jA $_21
  486.         jmp $_22
  487. $_21:
  488. $_23:
  489.                 inc    di    ; add    di, 2
  490.                 inc    di    ;
  491.             cmp ax, _freq[di]
  492.             jA $_23
  493. $_24:
  494.             dec    di    ; sub    di, 2
  495.             dec    di        ;
  496.             xchg    ax, _freq[di]    ;
  497.             mov    _freq[si], ax    ;
  498.                         ;
  499.             mov    bx, _son[si]    ;
  500.             mov    _prnt[bx], di    ;
  501.             cmp bx, T * 2
  502.             jAE $_25
  503.                 mov    _prnt[bx + 2], di
  504. $_25:
  505.             xchg    bx, _son[di]    ;
  506.             mov    _prnt[bx], si    ;
  507.             cmp bx, T * 2
  508.             jAE $_26
  509.                 mov    _prnt[bx + 2], si
  510. $_26:
  511.             mov    _son[si], bx    ;
  512.                         ;
  513.             mov    si, di        ;
  514. $_22:
  515.         mov    si, _prnt[si]        ;
  516.     or si, si
  517.     jZ $_27
  518.     jmp $_19
  519. $_20:
  520. $_27:
  521.     ret                    ;
  522. _update    endp                    ;
  523.                         ;
  524. ;-----------------------------------------------;
  525. ;    égétéeé╠òäìåë╗                ;
  526. ;-----------------------------------------------;
  527. public    _EncodeChar                ;
  528. _EncodeChar    proc    near            ;
  529.     shl    bx, 1                ;
  530.     mov    si, bx                ;
  531.     mov    bx, _prnt[bx + T * 2]        ;
  532.     mov    ax, 0                ;
  533.     mov    ch, 0                ;
  534. $_28:
  535.         mov    dx, bx            ;
  536.         shr    dx, 1            ;
  537.         shr    dx, 1            ;
  538.         rcr    ax, 1            ;
  539.         inc    ch            ;
  540.         mov    bx, _prnt[bx]        ;
  541.     cmp bx, R * 2
  542.     jNE $_28
  543. $_29:
  544.     call    _Putcode            ;
  545.     call    _update                ;
  546.     ret                    ;
  547. _EncodeChar    endp                ;
  548.                         ;
  549. ;-----------------------------------------------;
  550. ;    ê╩ÆuÅεò±é╠òäìåë╗            ;
  551. ;-----------------------------------------------;
  552. public    _EncodePosition                ;
  553. _EncodePosition    proc    near            ;
  554.     mov    si, bx                ;
  555.     mov    cl, 6                ;
  556.     shr    bx, cl                ;
  557.     mov    ah, byte ptr DGROUP:_p_code[bx]    ;
  558.     mov    al, 0                ;
  559.     mov    ch, byte ptr DGROUP:_p_len[bx]    ;
  560.     call    near ptr _Putcode        ;
  561.     mov    ax, si                ;
  562.     mov    ah, al                ;
  563.     mov    al, 0                ;
  564.     shl    ax, 1                ;
  565.     shl    ax, 1                ;
  566.     mov    ch, 6                ;
  567.     call    near ptr _Putcode        ;
  568.     ret                    ;
  569. _EncodePosition    endp                ;
  570.                         ;
  571. ;-----------------------------------------------;
  572. ;    égétéeé╠òäìåë╗ÅIù╣Åêù¥            ;
  573. ;-----------------------------------------------;
  574.         public    _EncodeEnd        ;
  575. _EncodeEnd    proc    near            ;
  576. $_30:
  577.     cmp DGROUP:_iolen, 0
  578.     jLE $_32
  579.         mov    bx, DGROUP:_outfile    ;
  580.         mov    al, byte ptr _iobuf + 1    ;
  581.         putc@                ;
  582.         sub    _iolen, 8        ;
  583.         add    word ptr DGROUP:_codesize, 1
  584.         adc    word ptr DGROUP:_codesize + 2, 0
  585.     jmp $_30
  586. $_32:
  587. $_31:
  588.     ret                    ;
  589. _EncodeEnd    endp                ;
  590.                         ;
  591. ;-----------------------------------------------;
  592. ;    égétéeé╠ë≡ô╟                ;
  593. ;-----------------------------------------------;
  594.         public    _DecodeChar        ;
  595. _DecodeChar    proc    near            ;
  596.     mov    si, _son[R * 2]            ;
  597.     mov    dx, DGROUP:_iobuf        ;
  598.     mov    cl, DGROUP:_iolen        ;
  599.     and    cx, 00ffh            ;
  600.     jmp    short dc1            ;
  601. $_33:
  602.         shr    si, 1            ;
  603.         shl    dx, 1            ;
  604.         adc    si, 0            ;
  605.         shl    si, 1            ;
  606.         mov    si, _son[si]        ;
  607.         dec    cx            ;
  608. dc1:                        ;
  609.         jz    GetBuf            ;
  610. dc2:                        ;
  611.     cmp si, T * 2
  612.     jB $_33
  613. $_34:
  614.     mov    DGROUP:_iobuf, dx        ;
  615.     mov    DGROUP:_iolen, cl        ;
  616.     sub    si, T * 2            ;
  617.     mov    dx, si                ;
  618.     call    near ptr _update        ;
  619.     mov    ax, dx                ;
  620.     shr    ax, 1                ;
  621.     ret                    ;
  622. _DecodeChar    endp                ;
  623.                         ;
  624.     public    GetBuf                ;
  625. GetBuf:                        ;
  626.     mov    bx, DGROUP:_infile        ;
  627.     getc@                    ;
  628.     mov    dh, al                ;
  629.     mov    bx, DGROUP:_infile        ;
  630.     getc@                    ;
  631.     mov    dl, al                ;
  632.     mov    cl, 16                ;
  633.     jmp    short dc2            ;
  634.                         ;
  635. ;-----------------------------------------------;
  636. ;    ê╩ÆuÅεò±é╠ë≡ô╟                ;
  637. ;-----------------------------------------------;
  638.         public    _DecodePosition        ;
  639. _DecodePosition    proc    near            ;
  640.     call    near ptr _GetByte        ;
  641.     mov    si, ax                ;
  642.     mov    dl, _d_code[si]            ;
  643.     mov    dh, 0                ;
  644.     mov    cl, 6                ;
  645.     shl    dx, cl                ;
  646.     push    dx                ;
  647.     mov    cl, _d_len[si]            ;
  648.     mov    ch, 0                ;
  649.     sub    cx, 2                ;
  650.     call    near ptr _GetNBits        ;
  651.     or    ax, si                ;
  652.     rol    ax, cl                ;
  653.     and    ax, 003fh            ;
  654.     pop    dx                ;
  655.     add    ax, dx                ;
  656.     ret                    ;
  657. _DecodePosition    endp                ;
  658. _TEXT    ends                    ;
  659.     end                    ;
  660.